package cn.melon.bz;

import java.io.IOException;
import java.net.UnknownHostException;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 *  socket以及多线程管理类, 线程池中以键值对的形式进行保存, 使用时, 通过get获取线程, <br>
 *  此类中的所有变量和函数均为static, 均可直接调用
 *  
 *  <p>在客户端中, 线程池的应用并不会过多涉及线程池的应用, 因为每个客户端在同一时刻只与服务器端有一个连接,<br>
 *  换句话说, 我们的客户端线程池在程序运行到结束, 只有一个对象
 * @author corvo
 */
public class ClientThreadMgr {
    
    /**
     * 保存uuid, 与其对应的线程
     */
    private static Map<String, ClientThread> clientThreadPool = new LinkedHashMap<String, ClientThread>();
    
    /**
     * 
     * 添加线程socket线程
     * @param uuid  线程池中的将要保存为键
     * @param clientThread 线程池中存入的线程
     */
    public static void add(String uuid, ClientThread clientThread) {
        clientThreadPool.put(uuid, clientThread);        
    }
    
    public static ClientThread remove(String uuid) {
        ClientThread ct = clientThreadPool.get(uuid);
        if (ct != null) {       // 在移除线程时, 要注意将run中的死循环结束掉, 否则可能会有内存泄露
            try {
                ct.dispose();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return clientThreadPool.remove(uuid);
    }
    
    /**
     * 通过传入的键来获取线程, 如果在当前线程池中不存在该键所对应的对象,
     * 那么就会新建一个socket线程, 并且将新建的线程加入到线程池中
     * 
     * @param uuid 传入的key, 通过此对象获取唯一的线程
     * @return  返回得到的线程
     * @throws UnknownHostException  socket断线
     * @throws IOException socket断线或是连接问题
     */
    public static ClientThread get(String uuid) throws UnknownHostException, IOException {
        
        ClientThread ct = clientThreadPool.get(uuid);
        if (ct == null) ct = new ClientThread(uuid);
        clientThreadPool.put(uuid, ct);
        return ct;
    }
    
    /**
     * @return 返回线程池对象
     */
    public static Map<String, ClientThread> getPoll() {
        return clientThreadPool;
    }
    
    /**
     * @return 判断线程池是否为空
     */
    public static Boolean isEmpty() {
        return clientThreadPool.isEmpty();
    }
    
}
